var Calendar = function() {
    this._HTMLDom = null;

    // Util class
    this.mUtil = null;

    // 현재 표시하는 달력 날짜 데이터
    this.curDate = null;

    // 현재 선택한 날짜
    this.selectDate = null;

    // 예약 날짜 현황 데이터
    this.mDateList = new Array();

    // 예약 분류
    this.searchReservation = 0;

    // 지역
    this.searchArea = -1;

    // 골프장 코스
    this.searchCourse = -1;

    // My 설정 지역 검색 값
    this.mySearchArea = null;

    // 지역 설정 골프장 데이터
    this.mCourseByArea = new Array();
};
Calendar.prototype = {
    constructor : Calendar,
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // InterlockBooking class 에 연동요청
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * My 설정 데이터 요청
     */
    getMySetup : function() {
        var data = new Object();
        var interlockBooking = new InterlockBooking();
        var thisClass = this;

        $.mobile.showPageLoadingMsg();

        // 골프장 코스 데이터 초기화
        this.mCourseByArea = new Array();

        interlockBooking.getMySetup(data, function($data) {
            // alert("getMySetup success :: " + JSON.stringify($jsonData));
            // alert("success check :: " + objJson.checkResult($jsonData));
            if ($data != null) {
                console.log($data);
                var i = 0;
                var tempStr = "";
                while (i < $data.length) {
                    if (i != 0) {
                        tempStr += ",";
                    }
                    tempStr += $data[i].area_id + "," + $data[i].club_id

                    i++;
                }
                thisClass.mySearchArea = tempStr;
            } else {
                thisClass._HTMLDom.sel_area.find('option:eq(1)').hide();
            }

            $.mobile.hidePageLoadingMsg();

        }, function(e) {
            alert("fail :: " + JSON.stringify(e));
            $.mobile.hidePageLoadingMsg();
        });
    },
    /**
     * 실시간 예약 부킹 리스트 가져오는 연동
     */
    getRsvBookingData : function() {
        var data = new Object();
        var interlockBooking = new InterlockBooking();
        var thisClass = this;

        $.mobile.showPageLoadingMsg();

        // 데이터 초기화
        this.mDateList = new Array();

        data.date = "" + this.curDate.year + this.mUtil.getZeroNumString(this.curDate.month) + "01";
        data.search = this.setFilterArea();

        // setFilterArea 반환 값이 null 일 경우는 해당 지역의 골프장이 없기에 연동을 하지 않고 중지
        if (data.search == null) {
            thisClass.mDateList = null;
            thisClass.setCalendar(thisClass.curDate);
            return;
        }

        interlockBooking.getRsvBookingData(data, function($data) {
            console.log("getRsvBookingData !!!!!!");

            if ($data == null) {
                alert("예약 일정이 없습니다.");
            }
            thisClass.mDateList = $data;
            thisClass.setCalendar(thisClass.curDate);

        }, function(e) {
            alert("fail :: " + JSON.stringify(e));
            $.mobile.hidePageLoadingMsg();
        });
    },
    /**
     * 웨이팅 예약 리스트 가져오는 연동
     */
    getWaitingBookingData : function() {
        // TODO
    },
    /**
     * 지역별 골프 코스 요청 연동
     */
    getGolfCourseData : function($area) {
        var data = new Object();
        var interlockBooking = new InterlockBooking();
        var thisClass = this;

        $.mobile.showPageLoadingMsg();

        // 골프장 코스 데이터 초기화
        this.mCourseByArea = new Array();

        if ($area == -1) {
            data.area = "";
        } else {
            data.area = $area;
        }

        interlockBooking.getGolfClubData(data, function($data) {
            // 코스 데이터를 라디오 버튼에 적용
            thisClass.setSelectBtnByCourse($data);

            $.mobile.hidePageLoadingMsg();
        }, function(e) {
            alert("fail :: " + JSON.stringify(e));
            $.mobile.hidePageLoadingMsg();
        });
    },
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Method
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    setFilterArea : function() {
        var result = "";
        var area = this.searchArea;
        var club = this.searchCourse;
        var i = 0;

        // 지역 - 전체, 골프장 - 전체 선택시
        if (area == -1 && club == -1)
            return "";

        // 나의 설정
        if (this.searchArea == 0)
            return this.mySearchArea;

        // 해당 지역의 골프장 데이터가 없을 경우
        if (this.mCourseByArea == null)
            return null;

        if (area == -1) {
            result += this.mCourseByArea[club].area_id + "," + this.mCourseByArea[club].club_id;
        } else {
            if (club == -1) {
                // 골프장 전체로 되어 있을 경우
                while (i < this.mCourseByArea.length) {
                    if (i != 0) {
                        result += ",";
                    }
                    result += this.mCourseByArea[i].area_id + "," + this.mCourseByArea[i].club_id;
                    i++;
                }
            } else {
                result += this.mCourseByArea[club].area_id + "," + this.mCourseByArea[club].club_id;
            }
        }

        return result;
    },
    setCalendar : function($date) {
        console.log("setCalendar");
        var i = 0;
        var j = 0;
        var cnt = 1;
        var thisClass = this;

        if ($date == null) {
            var date = new Date();
        } else {
            var date = new Date($date.year, $date.month - 1, 1);
        }
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        var lastDay = thisClass.getLastDay(year, month);

        // 달력 타이틀 설정
        $('#cal_title').text(year + "년 " + thisClass.mUtil.getZeroNumString(month) + "월");

        // 달력 날짜 설정
        while (i < 6) {
            var addHtmlStr = "";
            j = 0;
            while (j < 7) {
                if (i == 0) {
                    if (j >= date.getDay()) {
                        addHtmlStr += thisClass.insertDay(cnt);
                        cnt++;
                    } else {
                        addHtmlStr += "<td> </td>";
                    }
                } else {
                    if (cnt > lastDay) {
                        addHtmlStr += "<td> </td>";
                    } else {
                        addHtmlStr += thisClass.insertDay(cnt);
                    }
                    cnt++;
                }
                j++;
            }
            $('#tr_week_' + i).html(addHtmlStr);
            $('#tr_week_' + i + ' > td > button').bind('click', function($event) {
                if ($(this).hasClass('on')) {
                    // 이미 선택이 되었을 때
                    thisClass.removeSelectDate("" + thisClass.curDate.year + thisClass.mUtil.getZeroNumString(thisClass.curDate.month) + thisClass.mUtil.getZeroNumString($event.currentTarget.firstChild.innerHTML));
                    $(this).removeClass('on');
                } else {
                    // 선택이 되어 있지 않았을때
                    if ($(this).has('span').length > 0) {
                        if (thisClass.selectDate.length < 7) {
                            // 예약이 있다는 표시의 아이콘이 있을 경우
                            thisClass.addSelectDate("" + thisClass.curDate.year + thisClass.mUtil.getZeroNumString(thisClass.curDate.month) + thisClass.mUtil.getZeroNumString($event.currentTarget.firstChild.innerHTML));
                            $(this).addClass('on');
                        }
                    } else {
                        // 예약이 있다는 표시의 아이콘이 없을 경우
                        alert("선택한 날짜에 부킹 일정이 없습니다.");
                    }
                }
            });
            i++;
        }

        this.markingSelectDay(this.selectDate);

        $.mobile.hidePageLoadingMsg();
    },
    markingSelectDay : function($selectDate) {
        var selectData = $selectDate;

        // 선택된 날짜 데이터에 포커싱을 주기 위한 코드
        i = 0;
        while (i < selectData.length) {
            // 날짜 분리
            var date = selectData[i];
            var year = date.substring(0, date.length - 4);
            var month = date.substr(date.length - 4, 2);
            var day = date.substr(date.length - 2, 2);

            // 같은 년도, 같은 월일 경우
            if (this.curDate.year == year && this.curDate.month == month) {
                // 해당 날짜의 데이터에 포커싱 css 추가
                $('#cal_day_' + day).addClass('on');
            }
            i++;
        }

    },
    /**
     * 해당 날짜의 데이터 선택 리스트 데이터에 추가 함수
     */
    addSelectDate : function($date) {
        var i = 0;
        var j = 0;
        var date = this.selectDate;

        while (j < date.length) {
            if (date[j] == $date) {
                // 선택한 아이템에 중복된 데이터가 있을 경우 종료
                return;
            }
            j++;
        }

        this.selectDate.push($date);
    },
    /**
     * 해당 날짜의 데이터 선택 리스트 데이터에 추가 함수
     */
    removeSelectDate : function($date) {
        var i = 0;
        while (i < this.selectDate.length) {
            // alert("test :: " + mDateList[i].date + ", " + (mDateList[i].date == $date) + ", " + $date);
            if (this.selectDate[i] == $date) {
                // 선택한 데이터가 일치할 Select 리스트에 제거
                this.selectDate.splice(i, 1);
                console.log(this.selectDate);
                return;
            }
            i++;
        }
    },
    /**
     * 날짜 추가 함수
     */
    insertDay : function($day) {
        // console.log("insertDay :: " + $day);
        var date = "" + this.curDate.year + this.mUtil.getZeroNumString(this.curDate.month) + this.mUtil.getZeroNumString($day);
        var day = this.mUtil.getZeroNumString($day);
        var result = "<td><button id='cal_day_" + day + "'data-role='none'><em>" + $day + "</em></button></td>";
        var searchIndex = this.searchReservation;
        var i = 0;

        if (this.mDateList != null) {
            while (i < this.mDateList.length) {
                if (this.mDateList[i].date != undefined && this.mDateList[i].date == date) {
                    if (searchIndex == 0) {
                        // 실시간 예약
                        result = "'<td><button id='cal_day_" + day + "'data-role='none'><em>" + $day + "</em><span class='ico_navi navi28'>icon</span></button></td>";
                    } else if (searchIndex == 1) {
                        // 웨이팅 예약
                        result = "'<td><button id='cal_day_" + day + "'data-role='none'><em>" + $day + "</em><span class='ico_navi navi31'>icon</span></button></td>";
                    }
                    break;
                }
                i++;
            }
        }

        return result;
    },
    /**
     * 골프장 라디오 버튼 리스트 설정 함수
     */
    setSelectBtnByCourse : function($arrCourseData) {
        var select = $('#sel_course');
        var tempStr = '<option value=-1>전체</option>';
        var i = 0;

        if ($arrCourseData != null) {
            while (i < $arrCourseData.length) {
                tempStr += '<option value="' + i + '">' + $arrCourseData[i].club_name + '</option>';
                i++;
            }
        }
        select.html(tempStr);

        $("#sel_course > option[value = " + this.searchCourse + "]").attr("selected", true);
        $('#sel_course').change();

        this.mCourseByArea = $arrCourseData;
        $.mobile.hidePageLoadingMsg();

        if (this.searchReservation == 0) {
            // 분류 실시간 예약
            this.getRsvBookingData();
        } else if (this.searchReservation == 1) {
            // 분류 웨이팅 예약
            this.getWaitingBookingData();
        }
    },
    getLastDay : function($calyear, $calmonth) {
        var dayOfMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

        if ((($calyear % 4 == 0) && ($calyear % 100 != 0)) || ($calyear % 400 == 0))
            dayOfMonth[1] = 29;

        var nDays = dayOfMonth[$calmonth - 1];

        return nDays;
    },
    /**
     * 필요한 테이터 셋팅
     */
    setData : function($data) {
        this.curDate = $data.calendar.curdate;
        this.selectDate = $data.calendar.selectDate;
        this.searchReservation = $data.category.searchReservation;
        this.searchArea = $data.category.searchArea;
        this.searchCourse = $data.category.searchCourse;

    },
    /**
     * 데이터 Global Object에 저장
     */
    saveData : function() {
        document.globalObj.BOOKING_DATA.calendar.curdate = this.curDate;
        document.globalObj.BOOKING_DATA.calendar.selectDate = this.selectDate;
        document.globalObj.BOOKING_DATA.category.searchReservation = this.searchReservation;
        document.globalObj.BOOKING_DATA.category.searchArea = this.searchArea;
        document.globalObj.BOOKING_DATA.category.searchCourse = this.searchCourse;
    },
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Initialize
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    onPageShow : function() {
        console.log("Calendar onPageBeforeShow!");
        thisClass = this;

        this.mUtil = document.globalObj.util;

        // 데이터 초기화
        this.setData(document.globalObj.BOOKING_DATA);

        this._HTMLDom = {
            // 예약 분류 라디오 버튼
            "sel_rsv" : $('#sel_rsv'),
            // 지역 라디오 버튼
            "sel_area" : $('#sel_area'),
            // 골프장 라디오 버튼
            "sel_course" : $('#sel_course')
        };

        // 초기 달력 설정
        var date = new Date();
        this.curDate = new Object();
        this.curDate.year = date.getFullYear();
        this.curDate.month = date.getMonth() + 1;
        this.curDate.day = date.getDate();

        if (this.selectDate == null) {
            this.selectDate = new Array();
        }

        if (document.globalObj.LOGIN_DATA.isLogin) {
            // 로그인 했을 경우 나의 My설정 데이터 요청
            this.getMySetup();
        } else {
            thisClass._HTMLDom.sel_area.find('option:eq(1)').hide();
        }

        // Set Button Event
        // 달력 이전달 이동 버튼 이벤트
        $('#prev_mon').click(function() {
            var curDate = thisClass.curDate;
            var searchReservation = thisClass.searchReservation;

            if (curDate.month == 1) {
                curDate.year--;
                curDate.month = 12;
            } else {
                curDate.month--;
            }

            if (searchReservation == 0) {
                // 분류 실시간 예약
                thisClass.getRsvBookingData();
            } else if (searchReservation == 1) {
                // 분류 웨이팅 예약
                thisClass.getWaitingBookingData();
            }
        });

        // 달력 다음달 이동 버튼 이벤트
        $('#next_mon').click(function() {
            var curDate = thisClass.curDate;
            var searchReservation = thisClass.searchReservation;

            if (curDate.month == 12) {
                curDate.year++;
                curDate.month = 1;
            } else {
                curDate.month++;
            }

            if (searchReservation == 0) {
                // 분류 실시간 예약
                thisClass.getRsvBookingData();
            } else if (searchReservation == 1) {
                // 분류 웨이팅 예약
                thisClass.getWaitingBookingData();
            }
        });

        // My 설정 버튼
        $('#my_setup').on('click', function() {
            thisClass.saveData();

            if (document.globalObj.LOGIN_DATA.isLogin) {
                $.mobile.changePage("my_setup.html");
            } else {
                document.globalObj.LOGIN_DATA.loginAfterUrl = '../booking/my_setup.html';
                $.mobile.changePage('../member/login.html');
            }
        });

        // 검색 결과 버튼
        $('#go_list').click(function() {
            console.log(thisClass.selectDate);
            thisClass.saveData();

            if (thisClass.searchReservation == 0) {
                $.mobile.changePage('time_list.html');
            } else if (thisClass.searchReservation == 1) {
                $.mobile.changePage('wait_list.html');
            }
        });

        // 페이지 표시 이후 처리할 내용
        $("#calendar").on('pageshow', function() {

            // 초기 골프장 데이터 가져오기
            if (thisClass.searchArea == 0) {
                var selector = $('#sel_course');
                selector.html('<option value="0">My 설정 지역</option>');
                selector.change();
                
                if (thisClass.searchReservation == 0) {
                    thisClass.selectDate = new Array();
                    // 분류 실시간 예약
                    thisClass.getRsvBookingData();
                } else if (thisClass.searchReservation == 1) {
                    thisClass.selectDate = new Array();
                    // 분류 웨이팅 예약
                    thisClass.getWaitingBookingData();
                }
            } else {
                thisClass.getGolfCourseData(thisClass.searchArea);
            }

            // 상단 텝 초기화
            $("#sel_rsv > option[value = " + thisClass.searchReservation + "]").attr("selected", true);
            $('#sel_rsv').change();
            $("#sel_area > option[value = " + thisClass.searchArea + "]").attr("selected", true);
            $('#sel_area').change();
            $("#sel_course > option[value = " + thisClass.searchCourse + "]").attr("selected", true);
            $('#sel_course').change();

            // 겁색 탭 이벤트 설정
            thisClass._HTMLDom.sel_rsv.change(function() {

                thisClass.searchReservation = $('#sel_rsv option:selected').val();

                var searchReservation = thisClass.searchReservation;

                if (searchReservation == 0) {
                    // 선택한 날짜 초기화
                    thisClass.selectDate = new Array();

                    $('#btn_list').attr('href', 'time_list.html');
                    $('#btn_list').change();

                    // 분류 실시간 예약
                    thisClass.getRsvBookingData();
                } else if (searchReservation == 1) {
                    // 선택한 날짜 초기화
                    thisClass.selectDate = new Array();

                    $('#btn_list').attr('href', 'wait_list.html');
                    $('#btn_list').change();

                    // 분류 웨이팅 예약
                    thisClass.getWaitingBookingData();
                } else if (searchReservation == 2) {
                    // 분류 자선 예약
                    $.mobile.changePage("donation.html");
                }
            });

            // 지역 선택 라디오 버튼
            thisClass._HTMLDom.sel_area.click(function() {
                thisClass.searchArea = $('#sel_area option:selected').val();
                var searchArea = thisClass.searchArea;
                var searchReservation = thisClass.searchReservation;
                thisClass.searchCourse = -1;

                if (searchArea == 0) {
                    var selector = thisClass._HTMLDom.sel_course;
                    selector.html('<option value="0">My 설정 지역</option>');
                    selector.change();

                    if (searchReservation == 0) {
                        thisClass.selectDate = new Array();
                        // 분류 실시간 예약
                        thisClass.getRsvBookingData();
                    } else if (searchReservation == 1) {
                        thisClass.selectDate = new Array();
                        // 분류 웨이팅 예약
                        thisClass.getWaitingBookingData();
                    }
                } else {
                    // 골프장 코스 Selector 초기화
                    $('#sel_course option:first').attr('selected', true);
                    $('#sel_course').change();
                    thisClass.getGolfCourseData(searchArea);
                }
            });

            // 골프장 선택 라디오 버튼
            thisClass._HTMLDom.sel_course.click(function() {
                thisClass.searchCourse = $('#sel_course option:selected').val();

                var searchReservation = thisClass.searchReservation;
                if (searchReservation == 0) {
                    thisClass.selectDate = new Array();
                    // 분류 실시간 예약
                    thisClass.getRsvBookingData();
                } else if (searchReservation == 1) {
                    thisClass.selectDate = new Array();
                    // 분류 웨이팅 예약
                    thisClass.getWaitingBookingData();
                }

            });
        });
    }
};
